---
title: 語法對比基礎
---

本模組深入探討 JavaScript 和 C++ 之間的基本語法差異，涵蓋變數宣告、控制流程、函式和基本資料類型。

## 變數宣告和類型系統

JavaScript 是動態類型語言，這表示變數類型在運行時確定。C++ 是靜態類型語言，需要在編譯時進行明確的類型宣告。

<UniversalEditor title="變數宣告和賦值對比" compare={true}>
```javascript !! js
// JavaScript: 動態類型
let age = 30; // 數字
let name = "Alice"; // 字串
let isActive = true; // 布林值

console.log(typeof age); // "number"
console.log(typeof name); // "string"
```

```cpp !! cpp
// C++: 靜態類型
int age = 30; // 整數
std::string name = "Alice"; // 字串
bool isActive = true; // 布林值

// C++ 類型在編譯時檢查，沒有類似 'typeof' 的運行時類型檢查。
// 若要列印值：
// std::cout << "Age: " << age << std::endl;
// std::cout << "Name: " << name << std::endl;
```
</UniversalEditor>

## 控制流程語句對比

兩種語言都支援 `if/else`、`for`、`while` 和 `switch` 等常見的控制流程結構，但語法上略有不同。

### If/Else 語句

<UniversalEditor title="If/Else 對比" compare={true}>
```javascript !! js
// JavaScript: If/Else
let temperature = 25;

if (temperature > 30) {
  console.log("天氣很熱！");
} else if (temperature > 20) {
  console.log("天氣溫暖。");
} else {
  console.log("天氣很冷。");
}
```

```cpp !! cpp
// C++: If/Else
int temperature = 25;

if (temperature > 30) {
  // std::cout << "天氣很熱！" << std::endl;
} else if (temperature > 20) {
  // std::cout << "天氣溫暖。" << std::endl;
} else {
  // std::cout << "天氣很冷。" << std::endl;
}
```
</UniversalEditor>

### For 迴圈

<UniversalEditor title="For 迴圈對比" compare={true}>
```javascript !! js
// JavaScript: For 迴圈
for (let i = 0; i < 5; i++) {
  console.log(i);
}

// For...of (用於可迭代物件)
let arr = [1, 2, 3];
for (let val of arr) {
  console.log(val);
}
```

```cpp !! cpp
// C++: For 迴圈
for (int i = 0; i < 5; i++) {
  // std::cout << i << std::endl;
}

// 範圍基礎 for 迴圈 (C++11 及更高版本)
std::vector<int> vec = {1, 2, 3};
for (int val : vec) {
  // std::cout << val << std::endl;
}
```
</UniversalEditor>

## 函式定義和呼叫

C++ 中的函式需要明確的返回類型和參數類型，這與 JavaScript 不同。

<UniversalEditor title="函式定義對比" compare={true}>
```javascript !! js
// JavaScript: 函式定義
function greet(name) {
  return `Hello, ${name}!`;
}

const add = (a, b) => a + b; // 箭頭函式

console.log(greet("Bob"));
console.log(add(5, 3));
```

```cpp !! cpp
// C++: 函式定義
#include <string> // std::string 所需

std::string greet(std::string name) {
  return "Hello, " + name + "!";
}

int add(int a, int b) {
  return a + b;
}

// 在主函式中呼叫：
// std::cout << greet("Bob") << std::endl;
// std::cout << add(5, 3) << std::endl;
```
</UniversalEditor>

## 作用域和生命週期

兩種語言都具有區塊作用域，但 C++ 變數的生命週期與其作用域的關聯更為明確。

<UniversalEditor title="作用域和生命週期對比" compare={true}>
```javascript !! js
// JavaScript: 作用域
function example() {
  let x = 10;
  if (true) {
    let y = 20;
    console.log(x); // 10
    console.log(y); // 20
  }
  // console.log(y); // ReferenceError: y is not defined
}
example();
```

```cpp !! cpp
// C++: 作用域
#include <iostream>

void example() {
  int x = 10;
  if (true) {
    int y = 20;
    // std::cout << x << std::endl; // 10
    // std::cout << y << std::endl; // 20
  }
  // std::cout << y << std::endl; // 錯誤: 'y' 未在此作用域中宣告
}
// 在 main 中呼叫 example()
```
</UniversalEditor>

## 基本資料類型對比

C++ 擁有一組更豐富的具有固定大小的基本資料類型，對記憶體有更多的控制。

| JavaScript 類型 | C++ 等效類型                                  |
| :-------------- | :------------------------------------------------- |
| `number`        | `int`, `float`, `double`, `long`, `short`, 等    |
| `string`        | `std::string`, `char[]`, `char*`                   |
| `boolean`       | `bool`                                             |
| `null`          | `nullptr` (C++11), `NULL` (C 樣式)                |
| `undefined`     | 沒有直接等效；通常由 `nullptr` 或特定邏輯表示 |
| `object`        | `class`, `struct`, `union`                         |
| `symbol`        | 沒有直接等效                               |
| `bigint`        | `long long` (用於更大的整數), 外部函式庫用於任意精度 |

## 運算子和表達式

大多數算術、比較和邏輯運算子是相似的，但 C++ 還有用於指標和記憶體管理的額外運算子。

<UniversalEditor title="運算子對比" compare={true}>
```javascript !! js
// JavaScript: 運算子
let a = 10, b = 3;
let sum = a + b; // 13
let isEqual = (a === b); // false (嚴格相等)
let isGreater = (a > b); // true
```

```cpp !! cpp
// C++: 運算子
int a = 10, b = 3;
int sum = a + b; // 13
bool isEqual = (a == b); // false (相等)
bool isGreater = (a > b); // true

// C++ 也有指標專用的運算子，例如 * (解引用) 和 & (取位址)
```
</UniversalEditor>

## 命名空間概念

C++ 使用命名空間來組織程式碼並防止命名衝突，類似於 JavaScript 中的模組或匯入。

<UniversalEditor title="命名空間對比" compare={true}>
```javascript !! js
// JavaScript: 模組 (類似於命名空間)
// 檔案: math.js
export const PI = 3.14;
export function add(a, b) { return a + b; }

// 檔案: main.js
import { PI, add } from './math.js';
console.log(PI);
console.log(add(1, 2));
```

```cpp !! cpp
// C++: 命名空間
#include <iostream>

namespace Math {
  const double PI = 3.14;
  int add(int a, int b) { return a + b; }
}

// 在主函式或其他作用域中：
// std::cout << Math::PI << std::endl;
// std::cout << Math::add(1, 2) << std::endl;

// using 指令 (將所有名稱引入當前作用域)
// using namespace Math;
// std::cout << PI << std::endl;
```
</UniversalEditor>

---

### 練習題：
1.  解釋靜態類型和動態類型之間的區別，並提供 JavaScript 和 C++ 的範例。
2.  編寫一個 C++ 程式，接收使用者年齡作為輸入，並使用 `if/else if/else` 語句列印他們是未成年人、成年人還是老年人。
3.  命名空間在 C++ 程式設計中有何幫助？提供一個簡單的範例。

### 專案構想：
*   用 C++ 創建一個簡單的命令行程式，根據使用者輸入計算不同形狀（圓形、矩形、三角形）的面積，展示函式使用和基本資料類型。
